package com.tq68.weixin.rules;

import java.util.Date;

import com.tq68.weixin.common.AppConstantEnum.UserLevel;
import com.tq68.weixin.model.User;
import com.tq68.weixin.utils.DateUtils;

public class ContributionValueRank {
	
	//贡献值增加数量规则
	private int ADDCV_LOGIN = 3;//登录成功，每次增加1
	private int ADDCV_LIKE = 1;
	private int ADDCV_NEWPOST = 5;
	private int ADDCV_COMMENT = 3;
	
	//业主贡献值升级梯度
	private int MAXCV_L1 = 100; //一级村民贡献值上限
	private int MAXCV_L2 = 500; //二级村民贡献值上限
	private int MAXCV_L3 = 1000; //三级村民贡献值上限
	private int MAXCV_SC = 2000; //小队长贡献值上限
	private int MAXCV_BC = 3000; //大队长民贡献值上限
	private int MAXCV_DI = 5000; //村主任贡献值上限
                                 //村长贡献值无上限
	
	/**
	 * 登录成功后调用此方法，计算此用户因为登录而需要增加的贡献值，且为其更新贡献值，及是否升级。
	 * --每日只奖励一次登录，不重复奖励。
	 * return 0-不增加贡献值；1-增加贡献值成功，无升级；2-增加贡献值成功，有升级成功；3-增加贡献值成功，有升级失败；
	 */
	public int loginSuccess(int userId){
		User user = User.dao.findById(userId);
		if(user.getLastLoginDate()!=null&&!user.getLastLoginDate().equals(DateUtils.toDateStr(new Date()))){
			user.setContributionValue(user.getContributionValue()+ADDCV_LOGIN);
			return checkUpgradeUser(user);
		}else{
			return 0;
		}
		
	}
	
	/**
	 * 点赞成功后调用此方法，计算此用户因为点赞而需要增加的贡献值，且为其更新贡献值，及是否升级。
	 * return 0-不增加贡献值；1-增加贡献值成功，无升级；2-增加贡献值成功，有升级成功；3-增加贡献值成功，有升级失败；
	 */
	public int clickLike(int userId){
		User user = User.dao.findById(userId);
		user.setContributionValue(user.getContributionValue()+ADDCV_LIKE);
		return checkUpgradeUser(user);
		
	}
	
	/**
	 * 发帖成功后调用此方法，计算此用户因为发帖而需要增加的贡献值，且为其更新贡献值，及是否升级。
	 * return 0-不增加贡献值；1-增加贡献值成功，无升级；2-增加贡献值成功，有升级成功；3-增加贡献值成功，有升级失败；
	 */
	public int newPost(int userId){
		User user = User.dao.findById(userId);
		user.setContributionValue(user.getContributionValue()+ADDCV_NEWPOST);
		return checkUpgradeUser(user);
		
	}
	
	/**
	 * 评论成功后调用此方法，计算此用户因为评论而需要增加的贡献值，且为其更新贡献值，及是否升级。
	 * return 0-不增加贡献值；1-增加贡献值成功，无升级；2-增加贡献值成功，有升级成功；3-增加贡献值成功，有升级失败；
	 */
	public int giveComment(int userId){
		User user = User.dao.findById(userId);
		user.setContributionValue(user.getContributionValue()+ADDCV_COMMENT);
		return checkUpgradeUser(user);
		
	}
	
	/**
	 * 内部调用，查看新的贡献值是否需要升级，且保存数据。
	 * */
	private int checkUpgradeUser(User user){
		int re = 1;
		if(user.getUserlevel()!=null&&user.getUserlevel()==Integer.valueOf(UserLevel.Level1.getCode())){
			if(user.getContributionValue()>MAXCV_L1){
				user.setUserlevel(Integer.valueOf(UserLevel.Level2.getCode()));
				re=2;
			}
		}else if(user.getUserlevel()!=null&&user.getUserlevel()==Integer.valueOf(UserLevel.Level2.getCode())){
			if(user.getContributionValue()>MAXCV_L2){
				user.setUserlevel(Integer.valueOf(UserLevel.Level3.getCode()));
				re=2;
			}
		}else if(user.getUserlevel()!=null&&user.getUserlevel()==Integer.valueOf(UserLevel.Level3.getCode())){
			if(user.getContributionValue()>MAXCV_L3){
				user.setUserlevel(Integer.valueOf(UserLevel.SmallCaptain.getCode()));
				re=2;
			}
		}else if(user.getUserlevel()!=null&&user.getUserlevel()==Integer.valueOf(UserLevel.SmallCaptain.getCode())){
			if(user.getContributionValue()>MAXCV_SC){
				user.setUserlevel(Integer.valueOf(UserLevel.BigCaptain.getCode()));
				re=2;
			}
		}else if(user.getUserlevel()!=null&&user.getUserlevel()==Integer.valueOf(UserLevel.BigCaptain.getCode())){
			if(user.getContributionValue()>MAXCV_BC){
				user.setUserlevel(Integer.valueOf(UserLevel.Director.getCode()));
				re=2;
			}
		}else if(user.getUserlevel()!=null&&user.getUserlevel()==Integer.valueOf(UserLevel.Director.getCode())){
			if(user.getContributionValue()>MAXCV_DI){
				user.setUserlevel(Integer.valueOf(UserLevel.Master.getCode()));
				re=2;
			}
		}
		
		user.update();
		return re;
	}

}
